分类
联系方式
  1. 新浪微博
  2. E-mail

Edifice Engine ChangeManager

介绍

ChangeManager 用于记录对象(obj)的属性(key)改动。

ChangeManager 维护了一个 changes 结构,用于记录改动。元素是一个 tuple,含义分别为:

(对象, key, 对象是否有这个 key, 旧值, 新值)

使用场景

ChangeManager 并不是直接使用的,而是被 contextmanager 包装了一层:

@contextlib.contextmanager
def _storage_manager():
    changes = _ChangeManager()
    try:
        yield changes
    except Exception as e:
        changes.unwind()
        raise e

可以看到,包装的主要作用,是可以自动拦截异常,进行错误日志打印。

实际 ChangeManager 的使用场景,要看 _storage_manager 的使用场景。用于 Engine 的 _request_rerender。

ChangeManager 代码

class _ChangeManager(object):
    __slots__ = ("changes",)

    def __init__(self):
        self.changes = []

    def set(self, obj, key, value):
        old_value = None
        if hasattr(obj, key):
            old_value = getattr(obj, key)
        self.changes.append((obj, key, hasattr(obj, key), old_value, value))
        setattr(obj, key, value)

    def unwind(self):
        logger.warning("Encountered error while rendering. Unwinding changes.")
        # 省略异常报错逻辑